package day0401;

import java.util.*;


public class FenYueBing31 {
    /**
     * 31.公司分月饼，m个员工，买了n个月饼，m <= n，每个员工至少分一个月饼，但是也可以分到多个，单人分到最多月饼的个数是Max1，
     * 单人分到第二多月饼个数是Max2。
     * <p>
     * 但需要满足Max1-Max2 <= 3，单人分到第n-1多月饼个数是Max(n-1)，单人分到第n多月饼个数是Max(n), 想要满足Max(n-1) - Max(n) <= 3，
     * 问有多少种分月饼的方法？
     * <p>
     * 输入描述：
     * <p>
     * 每一行输入m，n，表示m个员工，n个月饼，m <=n
     * <p>
     * 输出描述：
     * <p>
     * 输出有多少种分法
     * <p>
     * 示例1：
     * 输入
     * 2 4
     * 输出
     * 2
     * 说明
     * 4=1+3
     * 4=2+2
     * 注意：1+3和3+1要算成同一种分法
     * <p>
     * 示例2：
     * 输入
     * 3 5
     * 输出
     * 2
     * 说明
     * 5=1+1+3
     * 5=1+2+3
     * 示例3：
     * 输入
     * 3 12
     * 输出
     * 6
     * 说明
     * 满足要求的6种分法：
     * <p>
     * 1、12 = 1 + 1 + 10 （Max1=10， Max2=1，不满足Max1-Max2 <= 3的约束）
     * <p>
     * 2、12 = 1 + 2 + 9 （Max1=9，Max2=2，不满足Max1-Max2 <= 3的约束）
     * <p>
     * 3、12 = 1 + 3 + 8 （Max1=8，Max2=3，不满足Max1-Max2 <= 3的约束）
     * <p>
     * 4、12 = 1 + 4 + 7 （Max1=7，Max2=4，Max3=1， 满足要求）
     * <p>
     * 5、12 = 1 + 5 + 6 （Max1=6，Max2=5，Max3=1， 不满足要求）
     * <p>
     * 6、12 = 2 + 2 + 8 （Max1=8，Max2=2，不满足要求）
     * <p>
     * 7、12 = 2 + 3 + 7 （Max1=7，Max2=3，不满足要求）
     * <p>
     * 8、12 = 2 + 4 + 6 （Max1=6，Max2=4，Max3=2， 满足要求）
     * <p>
     * 9、12 = 2 + 5 + 5 （Max1=5，Max2=2 满足要求）
     * <p>
     * 10、12 = 3 + 3 + 6 （Max1=6，Max2=3 满足要求）
     * <p>
     * 11、12 = 3 + 4 + 5 （Max1=5，Max2=4，Max3=3 满足要求）
     * <p>
     * 12 = 4 + 4 + 4 （Max1=4，满足要求）
     */

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        while (sc.hasNextLine()) {
            String[] s = sc.nextLine().split(" ");
            int p = Integer.parseInt(s[0]);// 人数
            int n = Integer.parseInt(s[1]);// 月饼个数
//            // 方法二： 没看明白
//            int result = process(p, n, 1);
//            System.out.println(result);

            n = n - p;// 先给每人一个月饼
            int[] arr = new int[p];//每个人分的个数
            HashSet<String> result = new HashSet<>();
            handOut(n, p, arr, result);
            System.out.println(result.size());

        }

    }

    private static void handOut(int n, int p, int[] arr, Set<String> result) {
        if (p == 1) {
            arr[0] = n;
            // 拷贝一个数组进行排序，避免在原数组上修改影响下次递归
            int[] copy = new int[arr.length];
            System.arraycopy(arr, 0, copy, 0, arr.length);
            Arrays.sort(copy);
            boolean flag = true;
            for (int i = 0; i < copy.length - 1; i++) {
                if (copy[i + 1] - copy[i] > 3) {
                    flag = false;
                    break;
                }
            }
            if (flag) {
                String string = Arrays.toString(copy);
                result.add(string);// 已经去重过的
            }
            return;
        }
        for (int i = 0; i <= n; i++) {
            arr[p - 1] = i;
            handOut(n - i, p - 1, arr, result);
        }
    }


    // num:表示最少每人分的个数
//    private static int process(int p, int n, int num) {
//        if (p == 1) { // 结束条件：最后一个人分剩下的月饼
//            return (n < num || n > num + 3) ? 0 : 1; // 分月饼结束时，月饼不能多
//        }
//        int count = 0;
//        for (int i = num; i <= n / p && i <= num + 3; i++) {
//            count += process(p - 1, n - i, i);
//        }
//        return count;
//    }
}

